#include <iostream>
#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/async.h>
#include <spdlog/async_logger.h>

/*
    异步日志记录器，向标准输出、文件输出日志
    主线程即完成任务，日志的刷新放到任务队列，交给线程池来完成（当满足刷新策略的时候才会刷新）
    异步相比同步效率高，适用于高频频大量的日志刷新，实时性没有同步好（主线程交给任务队列之后的日志，不会被及时刷新）
*/

int main()
{
    // ***全局函数***
    // 设置日志全局策略
    spdlog::flush_every(std::chrono::seconds(5));
    spdlog::set_level(spdlog::level::level_enum::debug);
    spdlog::flush_on(spdlog::level::level_enum::debug);

    // ***日志记录器输出日志***
    // 0、初始化线程池
    // inline void init_thread_pool(size_t q_size, size_t thread_count)，线程池的初始化接口
    spdlog::init_thread_pool(3072, 1); // 3072表示节点个数，能够保存多少个日志，1表示线程个数

    // 异步日志器的定义和同步接口一样，只不过默认就是同步，定义异步需要指名类型
    // 1.1、定义一个向标准输出输出的异步日志记录器
    // std::shared_ptr<spdlog::logger> async_logger = spdlog::stdout_color_mt<spdlog::async_factory>("stdout-logger");
    // 1.2、定义一个向文件输出的异步日志记录器
    std::shared_ptr<spdlog::logger> async_logger = spdlog::basic_logger_mt<spdlog::async_factory>("basefile-logger", "async.log");

    // 2、设置日志记录器的刷新策略
    async_logger->set_level(spdlog::level::level_enum::debug);
    async_logger->flush_on(spdlog::level::level_enum::err);

    // 3、设置日志输出格式
    async_logger->set_pattern("[%n][%H:%m:%S][%t][%-8l]: %v");
    // 4、日志的输出
    async_logger->trace("你好：{}", "小明");
    async_logger->debug("你好：{}", "小明");
    async_logger->info("你好：{}", "小明");
    async_logger->warn("你好：{}", "小明");
    async_logger->error("你好：{}", "小明");
    async_logger->critical("你好：{}", "小明");
    std::cout << "日志打印结束\n";

    return 0;
}